aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/fop
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/org/apache/fop')
-rw-r--r--src/java/org/apache/fop/apps/FOUserAgent.java12
-rw-r--r--src/java/org/apache/fop/apps/Fop.java73
-rw-r--r--src/java/org/apache/fop/apps/MimeConstants.java69
-rw-r--r--src/java/org/apache/fop/area/AreaTreeHandler.java7
-rw-r--r--src/java/org/apache/fop/area/CachedRenderPagesModel.java8
-rw-r--r--src/java/org/apache/fop/area/RenderPagesModel.java8
-rw-r--r--src/java/org/apache/fop/cli/CommandLineOptions.java189
-rw-r--r--src/java/org/apache/fop/cli/Main.java8
-rw-r--r--src/java/org/apache/fop/fo/FOTreeBuilder.java20
-rw-r--r--src/java/org/apache/fop/render/AbstractFOEventHandlerMaker.java68
-rw-r--r--src/java/org/apache/fop/render/AbstractRenderer.java5
-rw-r--r--src/java/org/apache/fop/render/AbstractRendererMaker.java61
-rw-r--r--src/java/org/apache/fop/render/Graphics2DAdapter.java49
-rw-r--r--src/java/org/apache/fop/render/Graphics2DImagePainter.java44
-rw-r--r--src/java/org/apache/fop/render/Renderer.java7
-rw-r--r--src/java/org/apache/fop/render/RendererFactory.java302
-rw-r--r--src/java/org/apache/fop/render/XMLHandlerRegistry.java3
-rw-r--r--src/java/org/apache/fop/render/awt/AWTRenderer.java3
-rw-r--r--src/java/org/apache/fop/render/awt/AWTRendererMaker.java49
-rw-r--r--src/java/org/apache/fop/render/bitmap/PNGRenderer.java3
-rw-r--r--src/java/org/apache/fop/render/bitmap/PNGRendererMaker.java49
-rw-r--r--src/java/org/apache/fop/render/bitmap/TIFFRenderer.java3
-rw-r--r--src/java/org/apache/fop/render/bitmap/TIFFRendererMaker.java49
-rw-r--r--src/java/org/apache/fop/render/java2d/Java2DGraphics2DAdapter.java86
-rw-r--r--src/java/org/apache/fop/render/java2d/Java2DRenderer.java19
-rw-r--r--src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java10
-rw-r--r--src/java/org/apache/fop/render/mif/MIFFOEventHandlerMaker.java51
-rw-r--r--src/java/org/apache/fop/render/mif/MIFHandler.java8
-rw-r--r--src/java/org/apache/fop/render/pcl/PCLRenderer.java4
-rw-r--r--src/java/org/apache/fop/render/pcl/PCLRendererMaker.java51
-rw-r--r--src/java/org/apache/fop/render/pdf/PDFGraphics2DAdapter.java106
-rw-r--r--src/java/org/apache/fop/render/pdf/PDFRenderer.java9
-rw-r--r--src/java/org/apache/fop/render/pdf/PDFRendererMaker.java49
-rw-r--r--src/java/org/apache/fop/render/print/PrintRendererMaker.java49
-rw-r--r--src/java/org/apache/fop/render/ps/PSGraphics2DAdapter.java90
-rw-r--r--src/java/org/apache/fop/render/ps/PSRenderer.java6
-rw-r--r--src/java/org/apache/fop/render/ps/PSRendererMaker.java49
-rw-r--r--src/java/org/apache/fop/render/ps/PSSVGHandler.java3
-rw-r--r--src/java/org/apache/fop/render/rtf/RTFFOEventHandlerMaker.java54
-rw-r--r--src/java/org/apache/fop/render/svg/SVGRendererMaker.java49
-rw-r--r--src/java/org/apache/fop/render/txt/TXTFOEventHandlerMaker.java52
-rw-r--r--src/java/org/apache/fop/render/txt/TXTHandler.java3
-rw-r--r--src/java/org/apache/fop/render/txt/TXTRendererMaker.java49
-rw-r--r--src/java/org/apache/fop/render/xml/XMLRenderer.java3
-rw-r--r--src/java/org/apache/fop/render/xml/XMLRendererMaker.java49
45 files changed, 1708 insertions, 230 deletions
diff --git a/src/java/org/apache/fop/apps/FOUserAgent.java b/src/java/org/apache/fop/apps/FOUserAgent.java
index 71a645c63..5d2686920 100644
--- a/src/java/org/apache/fop/apps/FOUserAgent.java
+++ b/src/java/org/apache/fop/apps/FOUserAgent.java
@@ -44,6 +44,7 @@ import org.apache.fop.fo.FOEventHandler;
import org.apache.fop.layoutmgr.LayoutManagerMaker;
import org.apache.fop.pdf.PDFEncryptionParams;
import org.apache.fop.render.Renderer;
+import org.apache.fop.render.RendererFactory;
import org.apache.fop.render.XMLHandlerRegistry;
/**
@@ -77,6 +78,9 @@ public class FOUserAgent {
/** Defines the default page-width */
public static final String DEFAULT_PAGE_WIDTH = "8.26in";
+ /** Factory for Renderers and FOEventHandlers */
+ private RendererFactory rendererFactory = new RendererFactory();
+
/** Registry for XML handlers */
private XMLHandlerRegistry xmlHandlers = new XMLHandlerRegistry();
@@ -592,8 +596,16 @@ public class FOUserAgent {
* If to create hot links to footnotes and before floats.
* @return True if hot links should be created
*/
+ /* TODO This method is never referenced!
public boolean linkToFootnotes() {
return true;
+ }*/
+
+ /**
+ * @return the RendererFactory
+ */
+ public RendererFactory getRendererFactory() {
+ return this.rendererFactory;
}
/**
diff --git a/src/java/org/apache/fop/apps/Fop.java b/src/java/org/apache/fop/apps/Fop.java
index 6c972185d..912e1a402 100644
--- a/src/java/org/apache/fop/apps/Fop.java
+++ b/src/java/org/apache/fop/apps/Fop.java
@@ -44,7 +44,10 @@ import org.apache.fop.fo.FOTreeBuilder;
public class Fop implements Constants {
// desired output type: RENDER_PDF, RENDER_PS, etc.
- private int renderType = NOT_SET;
+ //private int renderType = NOT_SET;
+
+ // desired output format: MIME type such as "application/pdf", "application/postscript" etc.
+ private String outputFormat = null;
// output stream to send results to
private OutputStream stream = null;
@@ -56,6 +59,32 @@ public class Fop implements Constants {
private FOTreeBuilder foTreeBuilder = null;
/**
+ * Constructor for use with already-created FOUserAgents. It uses MIME types to select the
+ * output format (ex. "application/pdf" for PDF).
+ * @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
+ * @param ua FOUserAgent object
+ * @throws IllegalArgumentException if an unsupported renderer type was requested.
+ */
+ public Fop(String outputFormat, FOUserAgent ua) {
+ this.outputFormat = outputFormat;
+
+ foUserAgent = ua;
+ if (foUserAgent == null) {
+ foUserAgent = new FOUserAgent();
+ }
+ }
+
+ /**
+ * Constructor for FOP with a default FOUserAgent. It uses MIME types to select the
+ * output format (ex. "application/pdf" for PDF).
+ * @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
+ * @throws IllegalArgumentException if an unsupported renderer type was requested.
+ */
+ public Fop(String outputFormat) {
+ this(outputFormat, null);
+ }
+
+ /**
* Constructor for use with already-created FOUserAgents
* @param renderType the type of renderer to use. Must be one of
* <ul>
@@ -76,18 +105,7 @@ public class Fop implements Constants {
* @throws IllegalArgumentException if an unsupported renderer type was requested.
*/
public Fop(int renderType, FOUserAgent ua) {
- if (renderType < Constants.RENDER_MIN_CONST
- || renderType > Constants.RENDER_MAX_CONST) {
- throw new IllegalArgumentException(
- "Invalid render type #" + renderType);
- }
-
- this.renderType = renderType;
-
- foUserAgent = ua;
- if (foUserAgent == null) {
- foUserAgent = new FOUserAgent();
- }
+ this(getMimeTypeForRenderType(renderType), ua);
}
/**
@@ -95,9 +113,34 @@ public class Fop implements Constants {
* @see org.apache.fop.apps.Fop#Fop(int, FOUserAgent)
*/
public Fop(int renderType) {
- this(renderType, new FOUserAgent());
+ this(renderType, null);
}
+ private static String getMimeTypeForRenderType(int renderType) {
+ switch(renderType) {
+ case Constants.RENDER_PDF: return MimeConstants.MIME_PDF;
+ case Constants.RENDER_PS: return MimeConstants.MIME_POSTSCRIPT;
+ case Constants.RENDER_PCL: return MimeConstants.MIME_PCL;
+ case Constants.RENDER_MIF: return MimeConstants.MIME_MIF;
+ case Constants.RENDER_RTF: return MimeConstants.MIME_RTF;
+ case Constants.RENDER_SVG: return MimeConstants.MIME_SVG;
+ case Constants.RENDER_TXT: return MimeConstants.MIME_PLAIN_TEXT;
+
+ //Bitmap formats
+ case Constants.RENDER_PNG: return MimeConstants.MIME_PNG;
+ case Constants.RENDER_TIFF: return MimeConstants.MIME_TIFF;
+
+ //Area tree XML: FOP-specific
+ case Constants.RENDER_XML: return MimeConstants.MIME_FOP_AREA_TREE;
+
+ //Non-standard pseudo MIME types
+ case Constants.RENDER_AWT: return MimeConstants.MIME_FOP_AWT_PREVIEW;
+ case Constants.RENDER_PRINT: return MimeConstants.MIME_FOP_PRINT;
+ default:
+ throw new IllegalArgumentException("Illegal renderType value: " + renderType);
+ }
+ }
+
/**
* Get the FOUserAgent instance for this process
* @return the user agent
@@ -128,7 +171,7 @@ public class Fop implements Constants {
*/
public DefaultHandler getDefaultHandler() throws FOPException {
if (foTreeBuilder == null) {
- this.foTreeBuilder = new FOTreeBuilder(renderType, foUserAgent, stream);
+ this.foTreeBuilder = new FOTreeBuilder(outputFormat, foUserAgent, stream);
}
return this.foTreeBuilder;
}
diff --git a/src/java/org/apache/fop/apps/MimeConstants.java b/src/java/org/apache/fop/apps/MimeConstants.java
new file mode 100644
index 000000000..f33ddf70f
--- /dev/null
+++ b/src/java/org/apache/fop/apps/MimeConstants.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2005 Jeremias Maerki
+ *
+ * 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.
+ */
+package org.apache.fop.apps;
+
+/**
+ * Frequently used MIME types for various file formats used when working with Apache FOP.
+ */
+public interface MimeConstants {
+
+ /** Portable Document Format */
+ String MIME_PDF = "application/pdf";
+
+ /** PostScript */
+ String MIME_POSTSCRIPT = "application/postscript";
+ /** Encapsulated PostScript (same MIME type as PostScript) */
+ String MIME_EPS = MIME_POSTSCRIPT;
+
+ /** HP's PCL */
+ String MIME_PCL = "application/x-pcl";
+ /** HP's PCL (alternative MIME type) */
+ String MIME_PCL_ALT = "application/vnd.hp-PCL";
+
+ /** Plain text */
+ String MIME_PLAIN_TEXT = "text/plain";
+
+ /** Rich text format */
+ String MIME_RTF = "application/rtf";
+ /** Rich text format (alternative 1) */
+ String MIME_RTF_ALT1 = "text/richtext";
+ /** Rich text format (alternative 2) */
+ String MIME_RTF_ALT2 = "text/rtf";
+
+ /** FrameMaker's MIF */
+ String MIME_MIF = "application/mif";
+
+ /** Structured Vector Graphics */
+ String MIME_SVG = "image/svg+xml";
+
+ /** PNG images */
+ String MIME_PNG = "image/png";
+ /** JPEG images */
+ String MIME_JPEG = "image/jpeg";
+ /** TIFF images */
+ String MIME_TIFF = "image/tiff";
+
+ /** Apache FOP's AWT preview (non-standard MIME type) */
+ String MIME_FOP_AWT_PREVIEW = "application/X-fop-awt-preview";
+ /** Apache FOP's Direct Printing (non-standard MIME type) */
+ String MIME_FOP_PRINT = "application/X-fop-print";
+ /** Apache FOP's area tree XML */
+ String MIME_FOP_AREA_TREE = "application/X-fop-areatree";
+
+ /** Proposed but non-registered MIME type for XSL-FO */
+ String MIME_XSL_FO = "text/xsl";
+
+}
diff --git a/src/java/org/apache/fop/area/AreaTreeHandler.java b/src/java/org/apache/fop/area/AreaTreeHandler.java
index 183ca8896..df7b74fb3 100644
--- a/src/java/org/apache/fop/area/AreaTreeHandler.java
+++ b/src/java/org/apache/fop/area/AreaTreeHandler.java
@@ -103,16 +103,15 @@ public class AreaTreeHandler extends FOEventHandler {
/**
* Constructor.
* @param userAgent FOUserAgent object for process
- * @param renderType Desired fo.Constants output type (RENDER_PDF,
- * RENDER_PS, etc.)
+ * @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
* @param stream OutputStream
* @throws FOPException if the RenderPagesModel cannot be created
*/
- public AreaTreeHandler (FOUserAgent userAgent, int renderType,
+ public AreaTreeHandler (FOUserAgent userAgent, String outputFormat,
OutputStream stream) throws FOPException {
super(userAgent);
- model = new RenderPagesModel(userAgent, renderType, fontInfo,
+ model = new RenderPagesModel(userAgent, outputFormat, fontInfo,
stream);
lmMaker = userAgent.getLayoutManagerMakerOverride();
diff --git a/src/java/org/apache/fop/area/CachedRenderPagesModel.java b/src/java/org/apache/fop/area/CachedRenderPagesModel.java
index d86e9913b..6737ccb5a 100644
--- a/src/java/org/apache/fop/area/CachedRenderPagesModel.java
+++ b/src/java/org/apache/fop/area/CachedRenderPagesModel.java
@@ -46,11 +46,11 @@ public class CachedRenderPagesModel extends RenderPagesModel {
/**
* Constructor
- * @see org.apache.fop.area.RenderPagesModel#RenderPagesModel(FOUserAgent, int, FontInfo, OutputStream)
+ * @see org.apache.fop.area.RenderPagesModel#RenderPagesModel(FOUserAgent, String, FontInfo, OutputStream)
*/
- public CachedRenderPagesModel (FOUserAgent userAgent, int renderType,
- FontInfo fontInfo, OutputStream stream) throws FOPException {
- super(userAgent, renderType, fontInfo, stream);
+ public CachedRenderPagesModel (FOUserAgent userAgent, String outputFormat,
+ FontInfo fontInfo, OutputStream stream) throws FOPException {
+ super(userAgent, outputFormat, fontInfo, stream);
}
/**
diff --git a/src/java/org/apache/fop/area/RenderPagesModel.java b/src/java/org/apache/fop/area/RenderPagesModel.java
index 505902e33..a3c6eda27 100644
--- a/src/java/org/apache/fop/area/RenderPagesModel.java
+++ b/src/java/org/apache/fop/area/RenderPagesModel.java
@@ -58,17 +58,17 @@ public class RenderPagesModel extends AreaTreeModel {
/**
* Create a new render pages model with the given renderer.
* @param userAgent FOUserAgent object for process
- * @param renderType Desired fo.Constants output type (RENDER_PDF,
- * RENDER_PS, etc.)
+ * @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
* @param fontInfo FontInfo object
* @param stream OutputStream
* @throws FOPException if the renderer cannot be properly initialized
*/
- public RenderPagesModel (FOUserAgent userAgent, int renderType,
+ public RenderPagesModel (FOUserAgent userAgent, String outputFormat,
FontInfo fontInfo, OutputStream stream) throws FOPException {
super();
- renderer = RendererFactory.createRenderer(userAgent, renderType);
+ renderer = userAgent.getRendererFactory().createRenderer(
+ userAgent, outputFormat);
try {
renderer.setupFontInfo(fontInfo);
diff --git a/src/java/org/apache/fop/cli/CommandLineOptions.java b/src/java/org/apache/fop/cli/CommandLineOptions.java
index b0c1bf4e0..c1d922964 100644
--- a/src/java/org/apache/fop/cli/CommandLineOptions.java
+++ b/src/java/org/apache/fop/cli/CommandLineOptions.java
@@ -28,6 +28,7 @@ import java.util.Vector;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
+import org.apache.fop.apps.MimeConstants;
import org.apache.fop.fo.Constants;
import org.apache.fop.pdf.PDFEncryptionManager;
import org.apache.fop.pdf.PDFEncryptionParams;
@@ -73,7 +74,7 @@ public class CommandLineOptions implements Constants {
/* input mode */
private int inputmode = NOT_SET;
/* output mode */
- private int outputmode = NOT_SET;
+ private String outputmode = null;
private FOUserAgent foUserAgent;
@@ -132,7 +133,7 @@ public class CommandLineOptions implements Constants {
inputHandler = createInputHandler();
- if (outputmode == RENDER_AWT) {
+ if (outputmode.equals(MimeConstants.MIME_FOP_AWT_PREVIEW)) {
AWTRenderer renderer = new AWTRenderer();
renderer.setRenderable(inputHandler); //set before user agent!
renderer.setUserAgent(foUserAgent);
@@ -217,6 +218,8 @@ public class CommandLineOptions implements Constants {
i = i + parseSVGOutputOption(args, i);
} else if (args[i].equals("-foout")) {
i = i + parseFOOutputOption(args, i);
+ } else if (args[i].equals("-out")) {
+ i = i + parseCustomOutputOption(args, i);
} else if (args[i].charAt(0) != '-') {
i = i + parseUnknownOption(args, i);
} else if (args[i].equals("-at")) {
@@ -323,15 +326,15 @@ public class CommandLineOptions implements Constants {
}
private int parseAWTOutputOption(String[] args, int i) throws FOPException {
- setOutputMode(RENDER_AWT);
+ setOutputMode(MimeConstants.MIME_FOP_AWT_PREVIEW);
return 0;
}
private int parsePDFOutputOption(String[] args, int i) throws FOPException {
- setOutputMode(RENDER_PDF);
+ setOutputMode(MimeConstants.MIME_PDF);
if ((i + 1 == args.length)
|| (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the pdf output file");
+ throw new FOPException("you must specify the PDF output file");
} else {
outfile = new File(args[i + 1]);
return 1;
@@ -339,10 +342,10 @@ public class CommandLineOptions implements Constants {
}
private int parseMIFOutputOption(String[] args, int i) throws FOPException {
- setOutputMode(RENDER_MIF);
+ setOutputMode(MimeConstants.MIME_MIF);
if ((i + 1 == args.length)
|| (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the mif output file");
+ throw new FOPException("you must specify the MIF output file");
} else {
outfile = new File(args[i + 1]);
return 1;
@@ -350,10 +353,10 @@ public class CommandLineOptions implements Constants {
}
private int parseRTFOutputOption(String[] args, int i) throws FOPException {
- setOutputMode(RENDER_RTF);
+ setOutputMode(MimeConstants.MIME_RTF);
if ((i + 1 == args.length)
|| (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the rtf output file");
+ throw new FOPException("you must specify the RTF output file");
} else {
outfile = new File(args[i + 1]);
return 1;
@@ -361,10 +364,10 @@ public class CommandLineOptions implements Constants {
}
private int parseTIFFOutputOption(String[] args, int i) throws FOPException {
- setOutputMode(RENDER_TIFF);
+ setOutputMode(MimeConstants.MIME_TIFF);
if ((i + 1 == args.length)
|| (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the tiff output file");
+ throw new FOPException("you must specify the TIFF output file");
} else {
outfile = new File(args[i + 1]);
return 1;
@@ -372,10 +375,10 @@ public class CommandLineOptions implements Constants {
}
private int parsePNGOutputOption(String[] args, int i) throws FOPException {
- setOutputMode(RENDER_PNG);
+ setOutputMode(MimeConstants.MIME_PNG);
if ((i + 1 == args.length)
|| (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the png output file");
+ throw new FOPException("you must specify the PNG output file");
} else {
outfile = new File(args[i + 1]);
return 1;
@@ -383,15 +386,15 @@ public class CommandLineOptions implements Constants {
}
private int parsePrintOutputOption(String[] args, int i) throws FOPException {
- setOutputMode(RENDER_PRINT);
+ setOutputMode(MimeConstants.MIME_FOP_PRINT);
return 0;
}
private int parsePCLOutputOption(String[] args, int i) throws FOPException {
- setOutputMode(RENDER_PCL);
+ setOutputMode(MimeConstants.MIME_PCL);
if ((i + 1 == args.length)
|| (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the pdf output file");
+ throw new FOPException("you must specify the PDF output file");
} else {
outfile = new File(args[i + 1]);
return 1;
@@ -399,7 +402,7 @@ public class CommandLineOptions implements Constants {
}
private int parsePostscriptOutputOption(String[] args, int i) throws FOPException {
- setOutputMode(RENDER_PS);
+ setOutputMode(MimeConstants.MIME_POSTSCRIPT);
if ((i + 1 == args.length)
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the PostScript output file");
@@ -410,7 +413,7 @@ public class CommandLineOptions implements Constants {
}
private int parseTextOutputOption(String[] args, int i) throws FOPException {
- setOutputMode(RENDER_TXT);
+ setOutputMode(MimeConstants.MIME_PLAIN_TEXT);
if ((i + 1 == args.length)
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the text output file");
@@ -421,10 +424,10 @@ public class CommandLineOptions implements Constants {
}
private int parseSVGOutputOption(String[] args, int i) throws FOPException {
- setOutputMode(RENDER_SVG);
+ setOutputMode(MimeConstants.MIME_SVG);
if ((i + 1 == args.length)
|| (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the svg output file");
+ throw new FOPException("you must specify the SVG output file");
} else {
outfile = new File(args[i + 1]);
return 1;
@@ -432,7 +435,7 @@ public class CommandLineOptions implements Constants {
}
private int parseFOOutputOption(String[] args, int i) throws FOPException {
- setOutputMode(RENDER_NONE);
+ setOutputMode(MimeConstants.MIME_XSL_FO);
if ((i + 1 == args.length)
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the FO output file");
@@ -442,12 +445,37 @@ public class CommandLineOptions implements Constants {
}
}
+ private int parseCustomOutputOption(String[] args, int i) throws FOPException {
+ String mime = null;
+ if ((i + 1 < args.length)
+ || (args[i + 1].charAt(0) != '-')) {
+ mime = args[i + 1];
+ if ("list".equals(mime)) {
+ String[] mimes = foUserAgent.getRendererFactory().listSupportedMimeTypes();
+ System.out.println("Supported MIME types:");
+ for (int j = 0; j < mimes.length; j++) {
+ System.out.println(" " + mimes[j]);
+ }
+ System.exit(0);
+ }
+ }
+ if ((i + 2 >= args.length)
+ || (args[i + 1].charAt(0) == '-')
+ || (args[i + 2].charAt(0) == '-')) {
+ throw new FOPException("you must specify the output format and the output file");
+ } else {
+ setOutputMode(mime);
+ outfile = new File(args[i + 2]);
+ return 2;
+ }
+ }
+
private int parseUnknownOption(String[] args, int i) throws FOPException {
if (inputmode == NOT_SET) {
inputmode = FO_INPUT;
fofile = new File(args[i]);
- } else if (outputmode == NOT_SET) {
- outputmode = RENDER_PDF;
+ } else if (outputmode == null) {
+ outputmode = MimeConstants.MIME_PDF;
outfile = new File(args[i]);
} else {
throw new FOPException("Don't know what to do with "
@@ -457,7 +485,7 @@ public class CommandLineOptions implements Constants {
}
private int parseAreaTreeOption(String[] args, int i) throws FOPException {
- setOutputMode(RENDER_XML);
+ setOutputMode(MimeConstants.MIME_FOP_AREA_TREE);
if ((i + 1 == args.length)
|| (args[i + 1].charAt(0) == '-')) {
throw new FOPException("you must specify the area-tree output file");
@@ -500,9 +528,9 @@ public class CommandLineOptions implements Constants {
}
}
- private void setOutputMode(int mode) throws FOPException {
- if (outputmode == NOT_SET) {
- outputmode = mode;
+ private void setOutputMode(String mime) throws FOPException {
+ if (outputmode == null) {
+ outputmode = mime;
} else {
throw new FOPException("you can only set one output method");
}
@@ -537,11 +565,13 @@ public class CommandLineOptions implements Constants {
throw new FOPException("No input file specified");
}
- if (outputmode == NOT_SET) {
+ if (outputmode == null) {
throw new FOPException("No output file specified");
}
- if ((outputmode == RENDER_AWT || outputmode == RENDER_PRINT) && outfile != null) {
+ if ((outputmode.equals(MimeConstants.MIME_FOP_AWT_PREVIEW)
+ || outputmode.equals(MimeConstants.MIME_FOP_PRINT))
+ && outfile != null) {
throw new FOPException("Output file may not be specified "
+ "for AWT or PRINT output");
}
@@ -577,7 +607,7 @@ public class CommandLineOptions implements Constants {
}
} else if (inputmode == FO_INPUT) {
- if (outputmode == RENDER_NONE) {
+ if (outputmode.equals(MimeConstants.MIME_XSL_FO)) {
throw new FOPException(
"FO output mode is only available if you use -xml and -xsl");
}
@@ -619,32 +649,17 @@ public class CommandLineOptions implements Constants {
}
/**
- * @return the type chosen renderer
- * @throws FOPException for invalid output modes
+ * @return the chosen output format (MIME type)
+ * @throws FOPException for invalid output formats
*/
- protected int getRenderer() throws FOPException {
- switch (outputmode) {
- case RENDER_PDF:
- case RENDER_AWT:
- case RENDER_MIF:
- case RENDER_PRINT:
- case RENDER_PCL:
- case RENDER_PS:
- case RENDER_TXT:
- case RENDER_SVG:
- case RENDER_RTF:
- case RENDER_TIFF:
- case RENDER_PNG:
- case RENDER_NONE:
- return outputmode;
- case RENDER_XML:
- foUserAgent.getRendererOptions().put("fineDetail", isCoarseAreaXml());
- return RENDER_XML;
- case NOT_SET:
+ protected String getOutputFormat() throws FOPException {
+ if (outputmode == null) {
throw new FOPException("Renderer has not been set!");
- default:
- throw new FOPException("Invalid Renderer setting!");
}
+ if (outputmode.equals(MimeConstants.MIME_FOP_AREA_TREE)) {
+ foUserAgent.getRendererOptions().put("fineDetail", isCoarseAreaXml());
+ }
+ return outputmode;
}
/**
@@ -672,14 +687,6 @@ public class CommandLineOptions implements Constants {
}
/**
- * Returns the output mode (output format, ex. NOT_SET or RENDER_PDF)
- * @return the output mode
- */
- public int getOutputMode() {
- return outputmode;
- }
-
- /**
* Returns the XSL-FO file if set.
* @return the XSL-FO file, null if not set
*/
@@ -786,7 +793,11 @@ public class CommandLineOptions implements Constants {
+ " -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"
+ + " see options with \"-print help\" \n"
+ + " -out mime outfile input will be rendered using the given MIME type\n"
+ + " (outfile req'd) Example: \"-out application/pdf D:\\out.pdf\"\n"
+ + " (Tip: \"-out list\" prints the list of supported MIME types)\n"
+ + "\n"
+ " -foout outfile input will only be XSL transformed. The intermediate \n"
+ " XSL-FO file is saved and no rendering is performed. \n"
+ " (Only available if you use -xml and -xsl parameters)\n\n"
@@ -832,66 +843,26 @@ public class CommandLineOptions implements Constants {
log.info("unknown input type");
}
log.info("Output mode: ");
- switch (outputmode) {
- case NOT_SET:
+ if (outputmode == null) {
log.info("not set");
- break;
- case RENDER_PDF:
- log.info("pdf");
- log.info("output file: " + outfile.toString());
- break;
- case RENDER_AWT:
+ } else if (MimeConstants.MIME_FOP_AWT_PREVIEW.equals(outputmode)) {
log.info("awt on screen");
if (outfile != null) {
log.error("awt mode, but outfile is set:");
log.info("out file: " + outfile.toString());
}
- break;
- case RENDER_MIF:
- log.info("mif");
- log.info("output file: " + outfile.toString());
- break;
- case RENDER_RTF:
- log.info("rtf");
- log.info("output file: " + outfile.toString());
- break;
- case RENDER_TIFF:
- log.info("tiff");
- log.info("output file: " + outfile.toString());
- break;
- case RENDER_PNG:
- log.info("png");
- log.info("output file: " + outfile.toString());
- break;
- case RENDER_PRINT:
+ } else if (MimeConstants.MIME_FOP_PRINT.equals(outputmode)) {
log.info("print directly");
if (outfile != null) {
log.error("print mode, but outfile is set:");
log.error("out file: " + outfile.toString());
}
- break;
- case RENDER_PCL:
- log.info("pcl");
- log.info("output file: " + outfile.toString());
- break;
- case RENDER_PS:
- log.info("PostScript");
- log.info("output file: " + outfile.toString());
- break;
- case RENDER_TXT:
- log.info("txt");
- log.info("output file: " + outfile.toString());
- break;
- case RENDER_SVG:
- log.info("svg");
- log.info("output file: " + outfile.toString());
- break;
- case RENDER_XML:
+ } else if (MimeConstants.MIME_FOP_AREA_TREE.equals(outputmode)) {
log.info("area tree");
log.info("output file: " + outfile.toString());
- break;
- default:
- log.info("unknown input type");
+ } else {
+ log.info(outputmode);
+ log.info("output file: " + outfile.toString());
}
log.info("OPTIONS");
diff --git a/src/java/org/apache/fop/cli/Main.java b/src/java/org/apache/fop/cli/Main.java
index 93befd5b1..260559c1e 100644
--- a/src/java/org/apache/fop/cli/Main.java
+++ b/src/java/org/apache/fop/cli/Main.java
@@ -29,6 +29,7 @@ import java.util.List;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
+import org.apache.fop.apps.MimeConstants;
/**
* Main command-line class for Apache FOP.
@@ -148,8 +149,9 @@ public class Main {
foUserAgent = options.getFOUserAgent();
Fop fop = null;
- if (options.getOutputMode() != CommandLineOptions.RENDER_NONE) {
- fop = new Fop(options.getRenderer(), foUserAgent);
+ String outputFormat = options.getOutputFormat();
+ if (!MimeConstants.MIME_XSL_FO.equals(outputFormat)) {
+ fop = new Fop(outputFormat, foUserAgent);
}
try {
@@ -175,7 +177,7 @@ public class Main {
// System.exit(0) called to close AWT/SVG-created threads, if any.
// AWTRenderer closes with window shutdown, so exit() should not
// be called here
- if (options.getOutputMode() != CommandLineOptions.RENDER_AWT) {
+ if (!MimeConstants.MIME_FOP_AWT_PREVIEW.equals(outputFormat)) {
System.exit(0);
}
} catch (Exception e) {
diff --git a/src/java/org/apache/fop/fo/FOTreeBuilder.java b/src/java/org/apache/fop/fo/FOTreeBuilder.java
index 595dc0566..3cb5d9cb2 100644
--- a/src/java/org/apache/fop/fo/FOTreeBuilder.java
+++ b/src/java/org/apache/fop/fo/FOTreeBuilder.java
@@ -30,7 +30,6 @@ import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.FormattingResults;
import org.apache.fop.area.AreaTreeHandler;
-import org.apache.fop.render.RendererFactory;
import org.apache.fop.util.Service;
import org.apache.fop.fo.ElementMapping.Maker;
import org.apache.fop.fo.pagination.Root;
@@ -94,19 +93,20 @@ public class FOTreeBuilder extends DefaultHandler {
/**
* FOTreeBuilder constructor
- * @param renderType output type as defined in Constants class
+ * @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
* @param foUserAgent in effect for this process
* @param stream OutputStream to direct results
* @throws FOPException if the FOTreeBuilder cannot be properly created
*/
- public FOTreeBuilder(int renderType, FOUserAgent foUserAgent,
+ public FOTreeBuilder(String outputFormat, FOUserAgent foUserAgent,
OutputStream stream) throws FOPException {
this.userAgent = foUserAgent;
//This creates either an AreaTreeHandler and ultimately a Renderer, or
//one of the RTF-, MIF- etc. Handlers.
- foEventHandler = RendererFactory.createFOEventHandler(foUserAgent, renderType, stream);
+ foEventHandler = foUserAgent.getRendererFactory().createFOEventHandler(
+ foUserAgent, outputFormat, stream);
foEventHandler.setPropertyListMaker(new PropertyListMaker() {
public PropertyList make(FObj fobj, PropertyList parentPropertyList) {
return new StaticPropertyList(fobj, parentPropertyList);
@@ -296,14 +296,22 @@ public class FOTreeBuilder extends DefaultHandler {
public void endElement(String uri, String localName, String rawName)
throws FOPException {
if (currentFObj == null) {
- throw new FOPException("No current FO is available. The input document may not be "
- + "a valid XSL-FO document.");
+ throw new IllegalStateException(
+ "endElement() called for " + rawName + " where there is no current element.");
+ } else if (!currentFObj.getLocalName().equals(localName)
+ || !currentFObj.getNamespaceURI().equals(uri)) {
+ log.warn("Mismatch: " + currentFObj.getLocalName()
+ + " (" + currentFObj.getNamespaceURI()
+ + ") vs. " + localName + " (" + uri + ")");
}
currentFObj.endOfNode();
if (currentPropertyList.getFObj() == currentFObj) {
currentPropertyList = currentPropertyList.getParentPropertyList();
}
+ if (currentFObj.getParent() == null) {
+ log.debug("endElement for top-level " + currentFObj.getName());
+ }
currentFObj = currentFObj.getParent();
}
diff --git a/src/java/org/apache/fop/render/AbstractFOEventHandlerMaker.java b/src/java/org/apache/fop/render/AbstractFOEventHandlerMaker.java
new file mode 100644
index 000000000..f18be7dfa
--- /dev/null
+++ b/src/java/org/apache/fop/render/AbstractFOEventHandlerMaker.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render;
+
+import java.io.OutputStream;
+
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.fo.FOEventHandler;
+
+/**
+ * Base class for factory classes which instantiate FOEventHandlers and provide information
+ * about them.
+ */
+public abstract class AbstractFOEventHandlerMaker {
+
+ /**
+ * Instantiates a new FOEventHandler.
+ * @param ua the user agent
+ * @param out OutputStream for the FOEventHandler to use
+ * @return the newly instantiated FOEventHandler
+ * @throws FOPException if a problem occurs while creating the event handler
+ */
+ public abstract FOEventHandler makeFOEventHandler(FOUserAgent ua, OutputStream out)
+ throws FOPException;
+
+ /**
+ * @return Indicates whether this renderer requires an OutputStream to work with.
+ */
+ public abstract boolean needsOutputStream();
+
+ /**
+ * @return an array of MIME types the renderer supports.
+ */
+ public abstract String[] getSupportedMimeTypes();
+
+ /**
+ * Indicates whether a specific MIME type is supported by this renderer.
+ * @param mimeType the MIME type (ex. "application/rtf")
+ * @return true if the MIME type is supported
+ */
+ public boolean isMimeTypeSupported(String mimeType) {
+ String[] mimes = getSupportedMimeTypes();
+ for (int i = 0; i < mimes.length; i++) {
+ if (mimes[i].equals(mimeType)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/AbstractRenderer.java b/src/java/org/apache/fop/render/AbstractRenderer.java
index 6dd4c7510..dc793611b 100644
--- a/src/java/org/apache/fop/render/AbstractRenderer.java
+++ b/src/java/org/apache/fop/render/AbstractRenderer.java
@@ -155,6 +155,11 @@ public abstract class AbstractRenderer
*/
public void processOffDocumentItem(OffDocumentItem oDI) { }
+ /** @see org.apache.fop.render.Renderer#getGraphics2DAdapter() */
+ public Graphics2DAdapter getGraphics2DAdapter() {
+ return null;
+ }
+
/**
* Prepare a page for rendering. This is called if the renderer supports
* out of order rendering. The renderer should prepare the page so that a
diff --git a/src/java/org/apache/fop/render/AbstractRendererMaker.java b/src/java/org/apache/fop/render/AbstractRendererMaker.java
new file mode 100644
index 000000000..3aa63b48c
--- /dev/null
+++ b/src/java/org/apache/fop/render/AbstractRendererMaker.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render;
+
+import org.apache.fop.apps.FOUserAgent;
+
+/**
+ * Base class for factory classes which instantiate Renderers and provide information
+ * about them.
+ */
+public abstract class AbstractRendererMaker {
+
+ /**
+ * Instantiates a new renderer.
+ * @param ua the user agent
+ * @return the newly instantiated renderer
+ */
+ public abstract Renderer makeRenderer(FOUserAgent ua);
+
+ /**
+ * @return Indicates whether this renderer requires an OutputStream to work with.
+ */
+ public abstract boolean needsOutputStream();
+
+ /**
+ * @return an array of MIME types the renderer supports.
+ */
+ public abstract String[] getSupportedMimeTypes();
+
+ /**
+ * Indicates whether a specific MIME type is supported by this renderer.
+ * @param mimeType the MIME type (ex. "application/pdf")
+ * @return true if the MIME type is supported
+ */
+ public boolean isMimeTypeSupported(String mimeType) {
+ String[] mimes = getSupportedMimeTypes();
+ for (int i = 0; i < mimes.length; i++) {
+ if (mimes[i].equals(mimeType)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/Graphics2DAdapter.java b/src/java/org/apache/fop/render/Graphics2DAdapter.java
new file mode 100644
index 000000000..e5b98e21c
--- /dev/null
+++ b/src/java/org/apache/fop/render/Graphics2DAdapter.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render;
+
+import java.io.IOException;
+
+/**
+ * This interface represents an optional feature that can be provided by
+ * a renderer. It is exposed by calling the getGraphics2DAdapter() method
+ * on the renderer. Renderers that support this feature allow painting
+ * of arbitrary images through a Graphics2D instance.
+ */
+public interface Graphics2DAdapter {
+
+ /**
+ * Paints an arbitrary images on a given Graphics2D instance. The renderer
+ * providing this functionality must set up a Graphics2D instance so that
+ * the image with the given extents (in mpt) can be painted by the painter
+ * passed to this method. The Graphics2DImagePainter is then passed this
+ * Graphics2D instance so the image can be painted.
+ * @param painter the painter which will paint the actual image
+ * @param context the renderer context for the current renderer
+ * @param x X position of the image
+ * @param y Y position of the image
+ * @param width width of the image
+ * @param height height of the image
+ * @throws IOException In case of an I/O error while writing the output format
+ */
+ void paintImage(Graphics2DImagePainter painter,
+ RendererContext context,
+ int x, int y, int width, int height) throws IOException;
+
+}
diff --git a/src/java/org/apache/fop/render/Graphics2DImagePainter.java b/src/java/org/apache/fop/render/Graphics2DImagePainter.java
new file mode 100644
index 000000000..3d946b624
--- /dev/null
+++ b/src/java/org/apache/fop/render/Graphics2DImagePainter.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render;
+
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.geom.Rectangle2D;
+
+/**
+ * This interface is used by the Graphics2DAdapter. Components that can paint using
+ * a Graphics2D instance can implement this interface to paint themselves.
+ */
+public interface Graphics2DImagePainter {
+
+ /**
+ * Called to paint the image. Implementations should scale so the image is
+ * painted fully inside the given area indicated by then Rectangle2D object.
+ * @param g2d the Graphics2D instance to paint on
+ * @param area the target area for the image
+ */
+ void paint(Graphics2D g2d, Rectangle2D area);
+
+ /**
+ * @return the dimensions of the image to be painted in millipoints
+ */
+ Dimension getImageSize();
+
+} \ No newline at end of file
diff --git a/src/java/org/apache/fop/render/Renderer.java b/src/java/org/apache/fop/render/Renderer.java
index ebe2215f1..da347e0e6 100644
--- a/src/java/org/apache/fop/render/Renderer.java
+++ b/src/java/org/apache/fop/render/Renderer.java
@@ -114,9 +114,14 @@ public interface Renderer {
*
* @param ext The extension element to be rendered
*/
- public void processOffDocumentItem(OffDocumentItem ext);
+ void processOffDocumentItem(OffDocumentItem ext);
/**
+ * @return the adapter for painting Java2D images (or null if not supported)
+ */
+ Graphics2DAdapter getGraphics2DAdapter();
+
+ /**
* This is called if the renderer supports out of order rendering. The
* renderer should prepare the page so that a page further on in the set of
* pages can be rendered. The body of the page should not be rendered. The
diff --git a/src/java/org/apache/fop/render/RendererFactory.java b/src/java/org/apache/fop/render/RendererFactory.java
index d4d1460bd..cb677a4a9 100644
--- a/src/java/org/apache/fop/render/RendererFactory.java
+++ b/src/java/org/apache/fop/render/RendererFactory.java
@@ -19,77 +19,195 @@
package org.apache.fop.render;
import java.io.OutputStream;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
//Avalon
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
//FOP
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.area.AreaTreeHandler;
-import org.apache.fop.fo.Constants;
import org.apache.fop.fo.FOEventHandler;
-import org.apache.fop.render.mif.MIFHandler;
-import org.apache.fop.render.rtf.RTFHandler;
-import org.apache.fop.render.txt.TXTHandler;
+import org.apache.fop.util.Service;
/**
* Factory for FOEventHandlers and Renderers.
*/
public class RendererFactory {
+ /** the logger */
+ private static Log log = LogFactory.getLog(RendererFactory.class);
+
+ private Map rendererMakerMapping = new java.util.HashMap();
+ private Map eventHandlerMakerMapping = new java.util.HashMap();
+
+
/**
- * Creates a Renderer object based on render-type desired
- * @param renderType the type of renderer to use
- * @return the new Renderer instance
- * @throws IllegalArgumentException if an unsupported renderer type was requested
+ * Main constructor.
*/
- private static Renderer newInstance(int renderType) throws IllegalArgumentException {
-
- switch (renderType) {
- case Constants.RENDER_PDF:
- return new org.apache.fop.render.pdf.PDFRenderer();
- case Constants.RENDER_AWT:
- return new org.apache.fop.render.awt.AWTRenderer();
- case Constants.RENDER_PRINT:
- return new org.apache.fop.render.print.PrintRenderer();
- case Constants.RENDER_PCL:
- return new org.apache.fop.render.pcl.PCLRenderer();
- case Constants.RENDER_TIFF:
- return new org.apache.fop.render.bitmap.TIFFRenderer();
- case Constants.RENDER_PNG:
- return new org.apache.fop.render.bitmap.PNGRenderer();
- case Constants.RENDER_PS:
- return new org.apache.fop.render.ps.PSRenderer();
- case Constants.RENDER_TXT:
- return new org.apache.fop.render.txt.TXTRenderer();
- case Constants.RENDER_XML:
- return new org.apache.fop.render.xml.XMLRenderer();
- case Constants.RENDER_SVG:
- return new org.apache.fop.render.svg.SVGRenderer();
- default:
- throw new IllegalArgumentException("Invalid renderer type "
- + renderType);
+ public RendererFactory() {
+ registerStandardRenderers();
+ discoverRenderers();
+
+ registerStandardEventHandlers();
+ discoverFOEventHandlers();
+ }
+
+ private void registerStandardRenderers() {
+ addRendererMaker(new org.apache.fop.render.pdf.PDFRendererMaker());
+ addRendererMaker(new org.apache.fop.render.ps.PSRendererMaker());
+ addRendererMaker(new org.apache.fop.render.pcl.PCLRendererMaker());
+ addRendererMaker(new org.apache.fop.render.svg.SVGRendererMaker());
+ addRendererMaker(new org.apache.fop.render.txt.TXTRendererMaker());
+ addRendererMaker(new org.apache.fop.render.bitmap.PNGRendererMaker());
+ addRendererMaker(new org.apache.fop.render.bitmap.TIFFRendererMaker());
+ addRendererMaker(new org.apache.fop.render.bitmap.TIFFRendererMaker());
+ addRendererMaker(new org.apache.fop.render.xml.XMLRendererMaker());
+ addRendererMaker(new org.apache.fop.render.awt.AWTRendererMaker());
+ addRendererMaker(new org.apache.fop.render.print.PrintRendererMaker());
+ }
+
+ private void registerStandardEventHandlers() {
+ addFOEventHandlerMaker(new org.apache.fop.render.rtf.RTFFOEventHandlerMaker());
+ addFOEventHandlerMaker(new org.apache.fop.render.mif.MIFFOEventHandlerMaker());
+ }
+
+ /**
+ * Add a new RendererMaker. If another maker has already been registered for a
+ * particular MIME type, this call overwrites the existing one.
+ * @param maker the RendererMaker
+ */
+ public void addRendererMaker(AbstractRendererMaker maker) {
+ String[] mimes = maker.getSupportedMimeTypes();
+ for (int i = 0; i < mimes.length; i++) {
+ //This overrides any renderer previously set for a MIME type
+ if (rendererMakerMapping.get(mimes[i]) != null) {
+ log.trace("Overriding renderer for " + mimes[i]
+ + " with " + maker.getClass().getName());
+ }
+ rendererMakerMapping.put(mimes[i], maker);
}
}
-
+
+ /**
+ * Add a new FOEventHandlerMaker. If another maker has already been registered for a
+ * particular MIME type, this call overwrites the existing one.
+ * @param maker the FOEventHandlerMaker
+ */
+ public void addFOEventHandlerMaker(AbstractFOEventHandlerMaker maker) {
+ String[] mimes = maker.getSupportedMimeTypes();
+ for (int i = 0; i < mimes.length; i++) {
+ //This overrides any event handler previously set for a MIME type
+ if (eventHandlerMakerMapping.get(mimes[i]) != null) {
+ log.trace("Overriding FOEventHandler for " + mimes[i]
+ + " with " + maker.getClass().getName());
+ }
+ eventHandlerMakerMapping.put(mimes[i], maker);
+ }
+ }
+
+ /**
+ * Add a new RendererMaker. If another maker has already been registered for a
+ * particular MIME type, this call overwrites the existing one.
+ * @param className the fully qualified class name of the RendererMaker
+ */
+ public void addRendererMaker(String className) {
+ try {
+ AbstractRendererMaker makerInstance
+ = (AbstractRendererMaker)Class.forName(className).newInstance();
+ addRendererMaker(makerInstance);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException("Could not find "
+ + className);
+ } catch (InstantiationException e) {
+ throw new IllegalArgumentException("Could not instantiate "
+ + className);
+ } catch (IllegalAccessException e) {
+ throw new IllegalArgumentException("Could not access "
+ + className);
+ } catch (ClassCastException e) {
+ throw new IllegalArgumentException(className
+ + " is not an "
+ + AbstractRendererMaker.class.getName());
+ }
+ }
+
+ /**
+ * Add a new FOEventHandlerMaker. If another maker has already been registered for a
+ * particular MIME type, this call overwrites the existing one.
+ * @param className the fully qualified class name of the FOEventHandlerMaker
+ */
+ public void addFOEventHandlerMaker(String className) {
+ try {
+ AbstractFOEventHandlerMaker makerInstance
+ = (AbstractFOEventHandlerMaker)Class.forName(className).newInstance();
+ addFOEventHandlerMaker(makerInstance);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException("Could not find "
+ + className);
+ } catch (InstantiationException e) {
+ throw new IllegalArgumentException("Could not instantiate "
+ + className);
+ } catch (IllegalAccessException e) {
+ throw new IllegalArgumentException("Could not access "
+ + className);
+ } catch (ClassCastException e) {
+ throw new IllegalArgumentException(className
+ + " is not an "
+ + AbstractFOEventHandlerMaker.class.getName());
+ }
+ }
+
+ /**
+ * Returns a RendererMaker which handles the given MIME type.
+ * @param mime the requested output format
+ * @return the requested RendererMaker or null if none is available
+ */
+ public AbstractRendererMaker getRendererMaker(String mime) {
+ AbstractRendererMaker maker
+ = (AbstractRendererMaker)rendererMakerMapping.get(mime);
+ return maker;
+ }
+
+ /**
+ * Returns a FOEventHandlerMaker which handles the given MIME type.
+ * @param mime the requested output format
+ * @return the requested FOEventHandlerMaker or null if none is available
+ */
+ public AbstractFOEventHandlerMaker getFOEventHandlerMaker(String mime) {
+ AbstractFOEventHandlerMaker maker
+ = (AbstractFOEventHandlerMaker)eventHandlerMakerMapping.get(mime);
+ return maker;
+ }
+
/**
* Creates a Renderer object based on render-type desired
* @param userAgent the user agent for access to configuration
- * @param renderType the type of renderer to use
+ * @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
* @return the new Renderer instance
* @throws FOPException if the renderer cannot be properly constructed
*/
- public static Renderer createRenderer(FOUserAgent userAgent, int renderType)
+ public Renderer createRenderer(FOUserAgent userAgent, String outputFormat)
throws FOPException {
if (userAgent.getRendererOverride() != null) {
return userAgent.getRendererOverride();
} else {
- Renderer rend = newInstance(renderType);
+ AbstractRendererMaker maker = getRendererMaker(outputFormat);
+ if (maker == null) {
+ throw new UnsupportedOperationException(
+ "No renderer for the requested format available: " + outputFormat);
+ }
+ Renderer rend = maker.makeRenderer(userAgent);
rend.setUserAgent(userAgent);
- String mimeType = rend.getMimeType();
+ String mimeType = rend.getMimeType(); //Always use main MIME type for this
Configuration userRendererConfig = null;
if (mimeType != null) {
userRendererConfig
@@ -110,40 +228,104 @@ public class RendererFactory {
/**
* Creates FOEventHandler instances based on the desired output.
* @param userAgent the user agent for access to configuration
- * @param renderType the type of renderer to use
+ * @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
* @param out the OutputStream where the output is written to (if applicable)
* @return the newly constructed FOEventHandler
* @throws FOPException if the FOEventHandler cannot be properly constructed
*/
- public static FOEventHandler createFOEventHandler(FOUserAgent userAgent,
- int renderType, OutputStream out) throws FOPException {
+ public FOEventHandler createFOEventHandler(FOUserAgent userAgent,
+ String outputFormat, OutputStream out) throws FOPException {
if (userAgent.getFOEventHandlerOverride() != null) {
return userAgent.getFOEventHandlerOverride();
} else {
- if (renderType != Constants.RENDER_PRINT
- && renderType != Constants.RENDER_AWT) {
- if (out == null && userAgent.getRendererOverride() == null) {
- throw new IllegalStateException(
- "OutputStream has not been set");
+ AbstractFOEventHandlerMaker maker = getFOEventHandlerMaker(outputFormat);
+ if (maker == null) {
+ AbstractRendererMaker rendMaker = getRendererMaker(outputFormat);
+ if (rendMaker == null && userAgent.getRendererOverride() == null) {
+ throw new UnsupportedOperationException(
+ "Don't know how to handle \"" + outputFormat + "\" as an output format."
+ + " Neither an FOEventHandler, nor a Renderer could be found"
+ + " for this output format.");
+ } else {
+ if (out == null
+ && userAgent.getRendererOverride() == null
+ && rendMaker.needsOutputStream()) {
+ throw new IllegalStateException(
+ "OutputStream has not been set");
+ }
+ //Found a Renderer so we need to construct an AreaTreeHandler.
+ return new AreaTreeHandler(userAgent, outputFormat, out);
}
- }
-
- if (renderType == Constants.RENDER_MIF) {
- return new MIFHandler(userAgent, out);
- } else if (renderType == Constants.RENDER_RTF) {
- return new RTFHandler(userAgent, out);
- } else if (renderType == Constants.RENDER_TXT) {
- return new TXTHandler(userAgent, out);
} else {
- if (renderType < Constants.RENDER_MIN_CONST
- || renderType > Constants.RENDER_MAX_CONST) {
- throw new IllegalArgumentException(
- "Invalid render ID#" + renderType);
+ return maker.makeFOEventHandler(userAgent, out);
+ }
+ }
+ }
+
+ /**
+ * @return an array of all supported MIME types
+ */
+ public String[] listSupportedMimeTypes() {
+ List lst = new java.util.ArrayList();
+ Iterator iter = this.rendererMakerMapping.keySet().iterator();
+ while (iter.hasNext()) {
+ lst.add(((String)iter.next()));
+ }
+ iter = this.eventHandlerMakerMapping.keySet().iterator();
+ while (iter.hasNext()) {
+ lst.add(((String)iter.next()));
+ }
+ Collections.sort(lst);
+ return (String[])lst.toArray(new String[lst.size()]);
+ }
+
+ /**
+ * Discovers Renderer implementations through the classpath and dynamically
+ * registers them.
+ */
+ private void discoverRenderers() {
+ // add mappings from available services
+ Iterator providers
+ = Service.providers(Renderer.class);
+ if (providers != null) {
+ while (providers.hasNext()) {
+ String str = (String)providers.next();
+ try {
+ if (log.isDebugEnabled()) {
+ log.debug("Dynamically adding maker for Renderer: " + str);
+ }
+ addRendererMaker(str);
+ } catch (IllegalArgumentException e) {
+ log.error("Error while adding maker for Renderer", e);
}
+
+ }
+ }
+ }
- return new AreaTreeHandler(userAgent, renderType, out);
+ /**
+ * Discovers FOEventHandler implementations through the classpath and dynamically
+ * registers them.
+ */
+ private void discoverFOEventHandlers() {
+ // add mappings from available services
+ Iterator providers
+ = Service.providers(FOEventHandler.class);
+ if (providers != null) {
+ while (providers.hasNext()) {
+ String str = (String)providers.next();
+ try {
+ if (log.isDebugEnabled()) {
+ log.debug("Dynamically adding maker for FOEventHandler: " + str);
+ }
+ addFOEventHandlerMaker(str);
+ } catch (IllegalArgumentException e) {
+ log.error("Error while adding maker for FOEventHandler", e);
+ }
+
}
}
}
+
}
diff --git a/src/java/org/apache/fop/render/XMLHandlerRegistry.java b/src/java/org/apache/fop/render/XMLHandlerRegistry.java
index 11a9470a1..5712ca3fa 100644
--- a/src/java/org/apache/fop/render/XMLHandlerRegistry.java
+++ b/src/java/org/apache/fop/render/XMLHandlerRegistry.java
@@ -76,7 +76,8 @@ public class XMLHandlerRegistry {
+ classname);
} catch (ClassCastException e) {
throw new IllegalArgumentException(classname
- + " is not an ElementMapping");
+ + " is not an "
+ + XMLHandler.class.getName());
}
}
diff --git a/src/java/org/apache/fop/render/awt/AWTRenderer.java b/src/java/org/apache/fop/render/awt/AWTRenderer.java
index 5287bd15d..37169d7e2 100644
--- a/src/java/org/apache/fop/render/awt/AWTRenderer.java
+++ b/src/java/org/apache/fop/render/awt/AWTRenderer.java
@@ -39,6 +39,7 @@ import java.io.IOException;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
import org.apache.fop.area.Area;
import org.apache.fop.area.PageViewport;
import org.apache.fop.datatypes.ColorType;
@@ -56,7 +57,7 @@ import org.apache.fop.render.java2d.Java2DRenderer;
public class AWTRenderer extends Java2DRenderer implements Pageable {
/** The MIME type for AWT-Rendering */
- public static final String MIME_TYPE = "application/X-awt";
+ public static final String MIME_TYPE = MimeConstants.MIME_FOP_AWT_PREVIEW;
/** The resource bundle used for AWT messages. */
protected Translator translator = null;
diff --git a/src/java/org/apache/fop/render/awt/AWTRendererMaker.java b/src/java/org/apache/fop/render/awt/AWTRendererMaker.java
new file mode 100644
index 000000000..c094d32ed
--- /dev/null
+++ b/src/java/org/apache/fop/render/awt/AWTRendererMaker.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.awt;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.render.AbstractRendererMaker;
+import org.apache.fop.render.Renderer;
+
+/**
+ * RendererMaker for the AWT Preview Renderer.
+ */
+public class AWTRendererMaker extends AbstractRendererMaker {
+
+ private static final String[] MIMES = new String[] {MimeConstants.MIME_FOP_AWT_PREVIEW};
+
+
+ /** @see org.apache.fop.render.AbstractRendererMaker */
+ public Renderer makeRenderer(FOUserAgent ua) {
+ return new AWTRenderer();
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#needsOutputStream() */
+ public boolean needsOutputStream() {
+ return false;
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#getSupportedMimeTypes() */
+ public String[] getSupportedMimeTypes() {
+ return MIMES;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/bitmap/PNGRenderer.java b/src/java/org/apache/fop/render/bitmap/PNGRenderer.java
index 3c24bf39f..143436d5d 100644
--- a/src/java/org/apache/fop/render/bitmap/PNGRenderer.java
+++ b/src/java/org/apache/fop/render/bitmap/PNGRenderer.java
@@ -11,6 +11,7 @@ import java.io.OutputStream;
import org.apache.batik.ext.awt.image.codec.PNGEncodeParam;
import org.apache.batik.ext.awt.image.codec.PNGImageEncoder;
import org.apache.fop.apps.FOPException;
+import org.apache.fop.apps.MimeConstants;
import org.apache.fop.area.PageViewport;
import org.apache.fop.render.java2d.Java2DRenderer;
@@ -22,7 +23,7 @@ import org.apache.fop.render.java2d.Java2DRenderer;
public class PNGRenderer extends Java2DRenderer {
/** The MIME type for png-Rendering */
- public static final String MIME_TYPE = "image/png";
+ public static final String MIME_TYPE = MimeConstants.MIME_PNG;
/** The file syntax prefix, eg. "page" will output "page1.png" etc */
private String filePrefix;
diff --git a/src/java/org/apache/fop/render/bitmap/PNGRendererMaker.java b/src/java/org/apache/fop/render/bitmap/PNGRendererMaker.java
new file mode 100644
index 000000000..bb21c496c
--- /dev/null
+++ b/src/java/org/apache/fop/render/bitmap/PNGRendererMaker.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.bitmap;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.render.AbstractRendererMaker;
+import org.apache.fop.render.Renderer;
+
+/**
+ * RendererMaker for the PNG Renderer.
+ */
+public class PNGRendererMaker extends AbstractRendererMaker {
+
+ private static final String[] MIMES = new String[] {MimeConstants.MIME_PNG};
+
+
+ /** @see org.apache.fop.render.AbstractRendererMaker */
+ public Renderer makeRenderer(FOUserAgent ua) {
+ return new PNGRenderer();
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#needsOutputStream() */
+ public boolean needsOutputStream() {
+ return true;
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#getSupportedMimeTypes() */
+ public String[] getSupportedMimeTypes() {
+ return MIMES;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/bitmap/TIFFRenderer.java b/src/java/org/apache/fop/render/bitmap/TIFFRenderer.java
index 0cc4c1798..264c7b6f6 100644
--- a/src/java/org/apache/fop/render/bitmap/TIFFRenderer.java
+++ b/src/java/org/apache/fop/render/bitmap/TIFFRenderer.java
@@ -41,6 +41,7 @@ import org.apache.batik.ext.awt.image.codec.tiff.TIFFImageEncoder;
import org.apache.batik.ext.awt.image.rendered.FormatRed;
import org.apache.commons.logging.Log;
import org.apache.fop.apps.FOPException;
+import org.apache.fop.apps.MimeConstants;
import org.apache.fop.render.java2d.Java2DRenderer;
/**
@@ -67,7 +68,7 @@ import org.apache.fop.render.java2d.Java2DRenderer;
public class TIFFRenderer extends Java2DRenderer {
/** The MIME type for tiff-Rendering */
- public static final String MIME_TYPE = "image/tiff";
+ public static final String MIME_TYPE = MimeConstants.MIME_TIFF;
/** */
private TIFFEncodeParam renderParams;
diff --git a/src/java/org/apache/fop/render/bitmap/TIFFRendererMaker.java b/src/java/org/apache/fop/render/bitmap/TIFFRendererMaker.java
new file mode 100644
index 000000000..3aaa01414
--- /dev/null
+++ b/src/java/org/apache/fop/render/bitmap/TIFFRendererMaker.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.bitmap;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.render.AbstractRendererMaker;
+import org.apache.fop.render.Renderer;
+
+/**
+ * RendererMaker for the TIFF Renderer.
+ */
+public class TIFFRendererMaker extends AbstractRendererMaker {
+
+ private static final String[] MIMES = new String[] {MimeConstants.MIME_TIFF};
+
+
+ /** @see org.apache.fop.render.AbstractRendererMaker */
+ public Renderer makeRenderer(FOUserAgent ua) {
+ return new TIFFRenderer();
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#needsOutputStream() */
+ public boolean needsOutputStream() {
+ return true;
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#getSupportedMimeTypes() */
+ public String[] getSupportedMimeTypes() {
+ return MIMES;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/java2d/Java2DGraphics2DAdapter.java b/src/java/org/apache/fop/render/java2d/Java2DGraphics2DAdapter.java
new file mode 100644
index 000000000..d2982e3c0
--- /dev/null
+++ b/src/java/org/apache/fop/render/java2d/Java2DGraphics2DAdapter.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.java2d;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.io.IOException;
+
+import org.apache.fop.render.Graphics2DAdapter;
+import org.apache.fop.render.Graphics2DImagePainter;
+import org.apache.fop.render.RendererContext;
+
+/**
+ * Graphics2DAdapter implementation for Java2D.
+ */
+public class Java2DGraphics2DAdapter implements Graphics2DAdapter {
+
+ private Java2DGraphicsState state;
+
+ /**
+ * Main constructor
+ * @param renderer the Renderer instance to which this instance belongs
+ */
+ public Java2DGraphics2DAdapter(Java2DGraphicsState state) {
+ this.state = state;
+ }
+
+ /** @see org.apache.fop.render.Graphics2DAdapter */
+ public void paintImage(Graphics2DImagePainter painter,
+ RendererContext context,
+ int x, int y, int width, int height) throws IOException {
+
+ float fwidth = width / 1000f;
+ float fheight = height / 1000f;
+ float fx = x / 1000f;
+ float fy = y / 1000f;
+
+ // get the 'width' and 'height' attributes of the SVG document
+ Dimension dim = painter.getImageSize();
+ float imw = (float)dim.getWidth() / 1000f;
+ float imh = (float)dim.getHeight() / 1000f;
+
+ float sx = fwidth / (float)imw;
+ float sy = fheight / (float)imh;
+
+ state.push();
+ state.getGraph().setColor(Color.black);
+ state.getGraph().setBackground(Color.black);
+
+ //TODO Clip to the image area.
+
+ // transform so that the coordinates (0,0) is from the top left
+ // and positive is down and to the right. (0,0) is where the
+ // viewBox puts it.
+ state.getGraph().translate(fx, fy);
+ AffineTransform at = AffineTransform.getScaleInstance(sx, sy);
+ if (!at.isIdentity()) {
+ state.getGraph().transform(at);
+ }
+
+ Rectangle2D area = new Rectangle2D.Double(0.0, 0.0, imw, imh);
+ painter.paint(state.getGraph(), area);
+
+ state.pop();
+
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/java2d/Java2DRenderer.java b/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
index 4661eb49d..4e288f4e4 100644
--- a/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
+++ b/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
@@ -26,7 +26,6 @@ import java.awt.RenderingHints;
import java.awt.color.ColorSpace;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
-import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
@@ -69,6 +68,7 @@ import org.apache.fop.image.FopImage;
import org.apache.fop.image.ImageFactory;
import org.apache.fop.image.XMLImage;
import org.apache.fop.render.AbstractRenderer;
+import org.apache.fop.render.Graphics2DAdapter;
import org.apache.fop.render.RendererContext;
import org.apache.fop.render.pdf.CTMHelper;
import org.apache.fop.traits.BorderProps;
@@ -100,9 +100,6 @@ import org.w3c.dom.Document;
*/
public abstract class Java2DRenderer extends AbstractRenderer implements Printable {
- /** The MIME type for Java2D-Rendering */
- public static final String MIME_TYPE = "application/X-Java2D";
-
/** The scale factor for the image size, values: ]0 ; 1] */
protected double scaleFactor = 1;
@@ -152,7 +149,7 @@ public abstract class Java2DRenderer extends AbstractRenderer implements Printab
*/
public void setUserAgent(FOUserAgent foUserAgent) {
super.setUserAgent(foUserAgent);
- Java2DSVGHandler xmlHandler = new Java2DSVGHandler();
+ Java2DSVGHandler xmlHandler = new Java2DSVGHandler(getMimeType());
userAgent.getXMLHandlerRegistry().addXMLHandler(xmlHandler);
userAgent.setRendererOverride(this); // for document regeneration
}
@@ -162,11 +159,6 @@ public abstract class Java2DRenderer extends AbstractRenderer implements Printab
return userAgent;
}
- /** @see org.apache.fop.render.AbstractRenderer */
- public String getMimeType() {
- return MIME_TYPE;
- }
-
/**
* @see org.apache.fop.render.Renderer#setupFontInfo(org.apache.fop.fonts.FontInfo)
*/
@@ -178,6 +170,11 @@ public abstract class Java2DRenderer extends AbstractRenderer implements Printab
FontSetup.setup(fontInfo, fontImage.createGraphics());
}
+ /** @see org.apache.fop.render.Renderer#getGraphics2DAdapter() */
+ public Graphics2DAdapter getGraphics2DAdapter() {
+ return new Java2DGraphics2DAdapter(state);
+ }
+
/**
* Sets the new scale factor.
* @param newScaleFactor ]0 ; 1]
@@ -1046,7 +1043,7 @@ public abstract class Java2DRenderer extends AbstractRenderer implements Printab
*/
public void renderDocument(Document doc, String ns, Rectangle2D pos) {
RendererContext context;
- context = new RendererContext(this, MIME_TYPE);
+ context = new RendererContext(this, getMimeType());
context.setUserAgent(userAgent);
context.setProperty(Java2DSVGHandler.JAVA2D_STATE, state);
diff --git a/src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java b/src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java
index d89adf63d..575967f03 100644
--- a/src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java
+++ b/src/java/org/apache/fop/render/java2d/Java2DSVGHandler.java
@@ -73,10 +73,14 @@ public class Java2DSVGHandler implements XMLHandler {
*/
public static final String JAVA2D_YPOS = "ypos";
+ private String mimeType;
+
/**
* Create a new Java2D XML handler for use by the Java2D renderer.
+ * @param MIME type that this handler is used for
*/
- public Java2DSVGHandler() {
+ public Java2DSVGHandler(String mime) {
+ this.mimeType = mime;
}
/** @see org.apache.fop.render.XMLHandler */
@@ -178,7 +182,7 @@ public class Java2DSVGHandler implements XMLHandler {
AffineTransform origTransform = info.state.getGraph().getTransform();
// correct integer roundoff
- info.state.getGraph().translate(x / 1000, y / 1000);
+ info.state.getGraph().translate(x / 1000f, y / 1000f);
//SVGSVGElement svg = ((SVGDocument) doc).getRootElement();
// Aspect ratio preserved by layout engine, not here
@@ -199,7 +203,7 @@ public class Java2DSVGHandler implements XMLHandler {
/** @see org.apache.fop.render.XMLHandler#getMimeType() */
public String getMimeType() {
- return Java2DRenderer.MIME_TYPE;
+ return this.mimeType;
}
/** @see org.apache.fop.render.XMLHandler#getNamespace() */
diff --git a/src/java/org/apache/fop/render/mif/MIFFOEventHandlerMaker.java b/src/java/org/apache/fop/render/mif/MIFFOEventHandlerMaker.java
new file mode 100644
index 000000000..96bde2600
--- /dev/null
+++ b/src/java/org/apache/fop/render/mif/MIFFOEventHandlerMaker.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.mif;
+
+import java.io.OutputStream;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.fo.FOEventHandler;
+import org.apache.fop.render.AbstractFOEventHandlerMaker;
+
+/**
+ * Maker class for MIF support.
+ */
+public class MIFFOEventHandlerMaker extends AbstractFOEventHandlerMaker {
+
+ private static final String[] MIMES = new String[] {MimeConstants.MIME_MIF};
+
+
+ /** @see org.apache.fop.render.AbstractFOEventHandlerMaker */
+ public FOEventHandler makeFOEventHandler(FOUserAgent ua, OutputStream out) {
+ return new MIFHandler(ua, out);
+ }
+
+ /** @see org.apache.fop.render.AbstractFOEventHandlerMaker#needsOutputStream() */
+ public boolean needsOutputStream() {
+ return true;
+ }
+
+ /** @see org.apache.fop.render.AbstractFOEventHandlerMaker#getSupportedMimeTypes() */
+ public String[] getSupportedMimeTypes() {
+ return MIMES;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/mif/MIFHandler.java b/src/java/org/apache/fop/render/mif/MIFHandler.java
index 78f108f82..c9ef2a53e 100644
--- a/src/java/org/apache/fop/render/mif/MIFHandler.java
+++ b/src/java/org/apache/fop/render/mif/MIFHandler.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,6 +22,8 @@ package org.apache.fop.render.mif;
import java.io.IOException;
import java.io.OutputStream;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.fo.FOEventHandler;
import org.apache.fop.fo.flow.BasicLink;
@@ -57,6 +59,9 @@ import org.xml.sax.SAXException;
*/
public class MIFHandler extends FOEventHandler {
+ /** Logger */
+ private static Log log = LogFactory.getLog(MIFHandler.class);
+
/** the MIFFile instance */
protected MIFFile mifFile;
@@ -82,6 +87,7 @@ public class MIFHandler extends FOEventHandler {
* @see org.apache.fop.fo.FOEventHandler#startDocument()
*/
public void startDocument() throws SAXException {
+ log.fatal("The MIF Handler is non-functional at this time. Please help resurrect it!");
mifFile = new MIFFile();
try {
mifFile.output(outStream);
diff --git a/src/java/org/apache/fop/render/pcl/PCLRenderer.java b/src/java/org/apache/fop/render/pcl/PCLRenderer.java
index a7283c7bb..f322d2679 100644
--- a/src/java/org/apache/fop/render/pcl/PCLRenderer.java
+++ b/src/java/org/apache/fop/render/pcl/PCLRenderer.java
@@ -19,6 +19,7 @@
package org.apache.fop.render.pcl;
// FOP
+import org.apache.fop.apps.MimeConstants;
import org.apache.fop.render.PrintRenderer;
// Java
@@ -33,7 +34,7 @@ import java.io.OutputStream;
public class PCLRenderer extends PrintRenderer {
/** The MIME type for PCL */
- public static final String MIME_TYPE = "application/vnd.hp-PCL";
+ public static final String MIME_TYPE = MimeConstants.MIME_PCL_ALT;
/**
* the current stream to add PCL commands to
@@ -156,6 +157,7 @@ public class PCLRenderer extends PrintRenderer {
public void startRenderer(OutputStream outputStream) throws IOException {
log.info("rendering areas to PCL");
+ log.fatal("The PCL Renderer is non-functional at this time. Please help resurrect it!");
currentStream = new PCLStream(outputStream);
// Set orientation.
diff --git a/src/java/org/apache/fop/render/pcl/PCLRendererMaker.java b/src/java/org/apache/fop/render/pcl/PCLRendererMaker.java
new file mode 100644
index 000000000..2e39d355a
--- /dev/null
+++ b/src/java/org/apache/fop/render/pcl/PCLRendererMaker.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.pcl;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.render.AbstractRendererMaker;
+import org.apache.fop.render.Renderer;
+
+/**
+ * RendererMaker for the PCL Renderer.
+ */
+public class PCLRendererMaker extends AbstractRendererMaker {
+
+ private static final String[] MIMES = new String[] {
+ MimeConstants.MIME_PCL,
+ MimeConstants.MIME_PCL_ALT};
+
+
+ /**@see org.apache.fop.render.AbstractRendererMaker */
+ public Renderer makeRenderer(FOUserAgent ua) {
+ return new PCLRenderer();
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#needsOutputStream() */
+ public boolean needsOutputStream() {
+ return true;
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#getSupportedMimeTypes() */
+ public String[] getSupportedMimeTypes() {
+ return MIMES;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/pdf/PDFGraphics2DAdapter.java b/src/java/org/apache/fop/render/pdf/PDFGraphics2DAdapter.java
new file mode 100644
index 000000000..8a72fc4b9
--- /dev/null
+++ b/src/java/org/apache/fop/render/pdf/PDFGraphics2DAdapter.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.pdf;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.io.IOException;
+
+import org.apache.batik.bridge.ViewBox;
+import org.apache.fop.render.Graphics2DAdapter;
+import org.apache.fop.render.Graphics2DImagePainter;
+import org.apache.fop.render.RendererContext;
+import org.apache.fop.svg.PDFGraphics2D;
+import org.w3c.dom.svg.SVGDocument;
+import org.w3c.dom.svg.SVGSVGElement;
+
+/**
+ * Graphics2DAdapter implementation for PDF.
+ */
+public class PDFGraphics2DAdapter implements Graphics2DAdapter {
+
+ private PDFRenderer renderer;
+
+ /**
+ * Main constructor
+ * @param renderer the Renderer instance to which this instance belongs
+ */
+ public PDFGraphics2DAdapter(PDFRenderer renderer) {
+ this.renderer = renderer;
+ }
+
+ /** @see org.apache.fop.render.Graphics2DAdapter */
+ public void paintImage(Graphics2DImagePainter painter,
+ RendererContext context,
+ int x, int y, int width, int height) throws IOException {
+
+ PDFSVGHandler.PDFInfo pdfInfo = PDFSVGHandler.getPDFInfo(context);
+
+ float fwidth = width / 1000f;
+ float fheight = height / 1000f;
+ float fx = x / 1000f;
+ float fy = y / 1000f;
+
+ // get the 'width' and 'height' attributes of the SVG document
+ Dimension dim = painter.getImageSize();
+ float imw = (float)dim.getWidth() / 1000f;
+ float imh = (float)dim.getHeight() / 1000f;
+
+ float sx = fwidth / (float)imw;
+ float sy = fheight / (float)imh;
+
+ renderer.saveGraphicsState();
+ renderer.setColor(Color.black, false, null);
+ renderer.setColor(Color.black, true, null);
+
+ //TODO Clip to the image area.
+
+ // transform so that the coordinates (0,0) is from the top left
+ // and positive is down and to the right. (0,0) is where the
+ // viewBox puts it.
+ renderer.currentStream.add(sx + " 0 0 " + sy + " " + fx + " "
+ + fy + " cm\n");
+
+
+ final boolean textAsShapes = false;
+ PDFGraphics2D graphics = new PDFGraphics2D(textAsShapes,
+ pdfInfo.fi, pdfInfo.pdfDoc,
+ pdfInfo.pdfContext, pdfInfo.pdfPage.referencePDF(),
+ renderer.currentFontName,
+ renderer.currentFontSize);
+ graphics.setGraphicContext(new org.apache.batik.ext.awt.g2d.GraphicContext());
+
+ AffineTransform transform = new AffineTransform();
+ transform.translate(fx, fy);
+ pdfInfo.pdfState.setTransform(transform);
+ graphics.setPDFState(pdfInfo.pdfState);
+ graphics.setOutputStream(pdfInfo.outputStream);
+
+ Rectangle2D area = new Rectangle2D.Double(0.0, 0.0, imw, imh);
+ painter.paint(graphics, area);
+
+ pdfInfo.currentStream.add(graphics.getString());
+ renderer.restoreGraphicsState();
+ pdfInfo.pdfState.pop();
+
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/pdf/PDFRenderer.java b/src/java/org/apache/fop/render/pdf/PDFRenderer.java
index f30b0e0d0..7006cb8b9 100644
--- a/src/java/org/apache/fop/render/pdf/PDFRenderer.java
+++ b/src/java/org/apache/fop/render/pdf/PDFRenderer.java
@@ -38,6 +38,7 @@ import org.apache.avalon.framework.configuration.ConfigurationException;
// FOP
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
import org.apache.fop.area.CTM;
import org.apache.fop.area.LineArea;
import org.apache.fop.area.Page;
@@ -78,6 +79,7 @@ import org.apache.fop.pdf.PDFStream;
import org.apache.fop.pdf.PDFText;
import org.apache.fop.pdf.PDFXObject;
import org.apache.fop.render.AbstractPathOrientedRenderer;
+import org.apache.fop.render.Graphics2DAdapter;
import org.apache.fop.render.RendererContext;
import org.apache.fop.fo.Constants;
@@ -102,7 +104,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer {
/**
* The mime type for pdf
*/
- public static final String MIME_TYPE = "application/pdf";
+ public static final String MIME_TYPE = MimeConstants.MIME_PDF;
/** Controls whether comments are written to the PDF stream. */
protected static final boolean WRITE_COMMENTS = true;
@@ -338,6 +340,11 @@ public class PDFRenderer extends AbstractPathOrientedRenderer {
}
}
+ /** @see org.apache.fop.render.Renderer#getGraphics2DAdapter() */
+ public Graphics2DAdapter getGraphics2DAdapter() {
+ return new PDFGraphics2DAdapter(this);
+ }
+
/**
* writes out a comment.
* @param text text for the comment
diff --git a/src/java/org/apache/fop/render/pdf/PDFRendererMaker.java b/src/java/org/apache/fop/render/pdf/PDFRendererMaker.java
new file mode 100644
index 000000000..cbab95260
--- /dev/null
+++ b/src/java/org/apache/fop/render/pdf/PDFRendererMaker.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.pdf;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.render.AbstractRendererMaker;
+import org.apache.fop.render.Renderer;
+
+/**
+ * RendererMaker for the PDF Renderer.
+ */
+public class PDFRendererMaker extends AbstractRendererMaker {
+
+ private static final String[] MIMES = new String[] {MimeConstants.MIME_PDF};
+
+
+ /**@see org.apache.fop.render.AbstractRendererMaker */
+ public Renderer makeRenderer(FOUserAgent ua) {
+ return new PDFRenderer();
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#needsOutputStream() */
+ public boolean needsOutputStream() {
+ return true;
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#getSupportedMimeTypes() */
+ public String[] getSupportedMimeTypes() {
+ return MIMES;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/print/PrintRendererMaker.java b/src/java/org/apache/fop/render/print/PrintRendererMaker.java
new file mode 100644
index 000000000..39e7fa921
--- /dev/null
+++ b/src/java/org/apache/fop/render/print/PrintRendererMaker.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.print;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.render.AbstractRendererMaker;
+import org.apache.fop.render.Renderer;
+
+/**
+ * RendererMaker for the Print Renderer.
+ */
+public class PrintRendererMaker extends AbstractRendererMaker {
+
+ private static final String[] MIMES = new String[] {MimeConstants.MIME_FOP_PRINT};
+
+
+ /**@see org.apache.fop.render.AbstractRendererMaker */
+ public Renderer makeRenderer(FOUserAgent ua) {
+ return new PrintRenderer();
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#needsOutputStream() */
+ public boolean needsOutputStream() {
+ return false;
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#getSupportedMimeTypes() */
+ public String[] getSupportedMimeTypes() {
+ return MIMES;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/ps/PSGraphics2DAdapter.java b/src/java/org/apache/fop/render/ps/PSGraphics2DAdapter.java
new file mode 100644
index 000000000..d54c87b8c
--- /dev/null
+++ b/src/java/org/apache/fop/render/ps/PSGraphics2DAdapter.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.ps;
+
+import java.awt.Dimension;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.io.IOException;
+
+import org.apache.fop.render.Graphics2DAdapter;
+import org.apache.fop.render.Graphics2DImagePainter;
+import org.apache.fop.render.RendererContext;
+
+/**
+ * Graphics2DAdapter implementation for PostScript.
+ */
+public class PSGraphics2DAdapter implements Graphics2DAdapter {
+
+ private PSRenderer renderer;
+
+ /**
+ * Main constructor
+ * @param renderer the Renderer instance to which this instance belongs
+ */
+ public PSGraphics2DAdapter(PSRenderer renderer) {
+ this.renderer = renderer;
+ }
+
+ /** @see org.apache.fop.render.Graphics2DAdapter */
+ public void paintImage(Graphics2DImagePainter painter,
+ RendererContext context,
+ int x, int y, int width, int height) throws IOException {
+ PSGenerator gen = renderer.gen;
+
+ float fwidth = width / 1000f;
+ float fheight = height / 1000f;
+ float fx = x / 1000f;
+ float fy = y / 1000f;
+
+ // get the 'width' and 'height' attributes of the SVG document
+ Dimension dim = painter.getImageSize();
+ float imw = (float)dim.getWidth() / 1000f;
+ float imh = (float)dim.getHeight() / 1000f;
+
+ float sx = fwidth / (float)imw;
+ float sy = fheight / (float)imh;
+
+ gen.commentln("%FOPBeginGraphics2D");
+ gen.saveGraphicsState();
+ // Clip to the image area.
+ gen.writeln("newpath");
+ gen.defineRect(fx, fy, fwidth, fheight);
+ gen.writeln("clip");
+
+ // transform so that the coordinates (0,0) is from the top left
+ // and positive is down and to the right. (0,0) is where the
+ // viewBox puts it.
+ gen.concatMatrix(sx, 0, 0, sy, fx, fy);
+
+ final boolean textAsShapes = false;
+ PSGraphics2D graphics = new PSGraphics2D(textAsShapes, gen);
+ graphics.setGraphicContext(new org.apache.batik.ext.awt.g2d.GraphicContext());
+ AffineTransform transform = new AffineTransform();
+ // scale to viewbox
+ transform.translate(fx, fy);
+ gen.getCurrentState().concatMatrix(transform);
+ Rectangle2D area = new Rectangle2D.Double(0.0, 0.0, imw, imh);
+ painter.paint(graphics, area);
+
+ gen.restoreGraphicsState();
+ gen.commentln("%FOPEndGraphics2D");
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/ps/PSRenderer.java b/src/java/org/apache/fop/render/ps/PSRenderer.java
index 1902df16e..5c43050d0 100644
--- a/src/java/org/apache/fop/render/ps/PSRenderer.java
+++ b/src/java/org/apache/fop/render/ps/PSRenderer.java
@@ -59,6 +59,7 @@ import org.apache.fop.image.EPSImage;
import org.apache.fop.image.FopImage;
import org.apache.fop.image.ImageFactory;
import org.apache.fop.image.XMLImage;
+import org.apache.fop.render.Graphics2DAdapter;
import org.apache.fop.render.AbstractPathOrientedRenderer;
import org.apache.fop.render.RendererContext;
import org.apache.fop.render.ps.extensions.PSSetupCode;
@@ -134,6 +135,11 @@ public class PSRenderer extends AbstractPathOrientedRenderer {
userAgent.getXMLHandlerRegistry().addXMLHandler(xmlHandler);
}
+ /** @see org.apache.fop.render.Renderer#getGraphics2DAdapter() */
+ public Graphics2DAdapter getGraphics2DAdapter() {
+ return new PSGraphics2DAdapter(this);
+ }
+
/**
* Write out a command
* @param cmd PostScript command
diff --git a/src/java/org/apache/fop/render/ps/PSRendererMaker.java b/src/java/org/apache/fop/render/ps/PSRendererMaker.java
new file mode 100644
index 000000000..077e45d72
--- /dev/null
+++ b/src/java/org/apache/fop/render/ps/PSRendererMaker.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.ps;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.render.AbstractRendererMaker;
+import org.apache.fop.render.Renderer;
+
+/**
+ * RendererMaker for the PostScript Renderer.
+ */
+public class PSRendererMaker extends AbstractRendererMaker {
+
+ private static final String[] MIMES = new String[] {MimeConstants.MIME_POSTSCRIPT};
+
+
+ /** @see org.apache.fop.render.AbstractRendererMaker */
+ public Renderer makeRenderer(FOUserAgent ua) {
+ return new PSRenderer();
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#needsOutputStream() */
+ public boolean needsOutputStream() {
+ return true;
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#getSupportedMimeTypes() */
+ public String[] getSupportedMimeTypes() {
+ return MIMES;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/ps/PSSVGHandler.java b/src/java/org/apache/fop/render/ps/PSSVGHandler.java
index 5d829c443..7768cb91a 100644
--- a/src/java/org/apache/fop/render/ps/PSSVGHandler.java
+++ b/src/java/org/apache/fop/render/ps/PSSVGHandler.java
@@ -307,6 +307,7 @@ public class PSSVGHandler implements XMLHandler {
gen.writeln("newpath");
gen.defineRect(xOffset / 1000f, yOffset / 1000f,
psInfo.getWidth() / 1000f, psInfo.getWidth() / 1000f);
+ //TODO Is the above correct? Twice getWidth??????????????
gen.writeln("clip");
// transform so that the coordinates (0,0) is from the top left
@@ -337,7 +338,7 @@ public class PSSVGHandler implements XMLHandler {
+ e.getMessage(), e);
}
- psInfo.psGenerator.restoreGraphicsState();
+ gen.restoreGraphicsState();
gen.commentln("%FOPEndSVG");
} catch (IOException ioe) {
log.error("SVG graphic could not be rendered: "
diff --git a/src/java/org/apache/fop/render/rtf/RTFFOEventHandlerMaker.java b/src/java/org/apache/fop/render/rtf/RTFFOEventHandlerMaker.java
new file mode 100644
index 000000000..2ad238b2e
--- /dev/null
+++ b/src/java/org/apache/fop/render/rtf/RTFFOEventHandlerMaker.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.rtf;
+
+import java.io.OutputStream;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.fo.FOEventHandler;
+import org.apache.fop.render.AbstractFOEventHandlerMaker;
+
+/**
+ * Maker class for RTF support.
+ */
+public class RTFFOEventHandlerMaker extends AbstractFOEventHandlerMaker {
+
+ private static final String[] MIMES = new String[] {
+ MimeConstants.MIME_RTF,
+ MimeConstants.MIME_RTF_ALT1,
+ MimeConstants.MIME_RTF_ALT2};
+
+
+ /** @see org.apache.fop.render.AbstractFOEventHandlerMaker */
+ public FOEventHandler makeFOEventHandler(FOUserAgent ua, OutputStream out) {
+ return new RTFHandler(ua, out);
+ }
+
+ /** @see org.apache.fop.render.AbstractFOEventHandlerMaker#needsOutputStream() */
+ public boolean needsOutputStream() {
+ return true;
+ }
+
+ /** @see org.apache.fop.render.AbstractFOEventHandlerMaker#getSupportedMimeTypes() */
+ public String[] getSupportedMimeTypes() {
+ return MIMES;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/svg/SVGRendererMaker.java b/src/java/org/apache/fop/render/svg/SVGRendererMaker.java
new file mode 100644
index 000000000..5dfcd3d03
--- /dev/null
+++ b/src/java/org/apache/fop/render/svg/SVGRendererMaker.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.svg;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.render.AbstractRendererMaker;
+import org.apache.fop.render.Renderer;
+
+/**
+ * RendererMaker for the SVG Renderer.
+ */
+public class SVGRendererMaker extends AbstractRendererMaker {
+
+ private static final String[] MIMES = new String[] {MimeConstants.MIME_SVG};
+
+
+ /**@see org.apache.fop.render.AbstractRendererMaker */
+ public Renderer makeRenderer(FOUserAgent ua) {
+ return new SVGRenderer();
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#needsOutputStream() */
+ public boolean needsOutputStream() {
+ return true;
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#getSupportedMimeTypes() */
+ public String[] getSupportedMimeTypes() {
+ return MIMES;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/txt/TXTFOEventHandlerMaker.java b/src/java/org/apache/fop/render/txt/TXTFOEventHandlerMaker.java
new file mode 100644
index 000000000..ddc981a40
--- /dev/null
+++ b/src/java/org/apache/fop/render/txt/TXTFOEventHandlerMaker.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.txt;
+
+import java.io.OutputStream;
+
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.fo.FOEventHandler;
+import org.apache.fop.render.AbstractFOEventHandlerMaker;
+
+/**
+ * Maker class for the special FOEventHandler for TXT support.
+ */
+public class TXTFOEventHandlerMaker extends AbstractFOEventHandlerMaker {
+
+ private static final String[] MIMES = new String[] {
+ MimeConstants.MIME_PLAIN_TEXT};
+
+ /** @see org.apache.fop.render.AbstractFOEventHandlerMaker */
+ public FOEventHandler makeFOEventHandler(FOUserAgent ua, OutputStream out) throws FOPException {
+ return new TXTHandler(ua, out);
+ }
+
+ /** @see org.apache.fop.render.AbstractFOEventHandlerMaker#needsOutputStream() */
+ public boolean needsOutputStream() {
+ return true;
+ }
+
+ /** @see org.apache.fop.render.AbstractFOEventHandlerMaker#getSupportedMimeTypes() */
+ public String[] getSupportedMimeTypes() {
+ return MIMES;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/txt/TXTHandler.java b/src/java/org/apache/fop/render/txt/TXTHandler.java
index d75e65f50..87e6defee 100644
--- a/src/java/org/apache/fop/render/txt/TXTHandler.java
+++ b/src/java/org/apache/fop/render/txt/TXTHandler.java
@@ -25,6 +25,7 @@ import java.util.List;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
import org.apache.fop.area.AreaTreeHandler;
import org.apache.fop.datatypes.CompoundDatatype;
import org.apache.fop.datatypes.Length;
@@ -94,7 +95,7 @@ public class TXTHandler extends AreaTreeHandler {
*/
public TXTHandler(FOUserAgent userAgent, OutputStream stream)
throws FOPException {
- super(userAgent, Constants.RENDER_TXT, stream);
+ super(userAgent, MimeConstants.MIME_PLAIN_TEXT, stream);
}
/**
diff --git a/src/java/org/apache/fop/render/txt/TXTRendererMaker.java b/src/java/org/apache/fop/render/txt/TXTRendererMaker.java
new file mode 100644
index 000000000..026c7996c
--- /dev/null
+++ b/src/java/org/apache/fop/render/txt/TXTRendererMaker.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.txt;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.render.AbstractRendererMaker;
+import org.apache.fop.render.Renderer;
+
+/**
+ * RendererMaker for the Plain Text Renderer.
+ */
+public class TXTRendererMaker extends AbstractRendererMaker {
+
+ private static final String[] MIMES = new String[] {MimeConstants.MIME_PLAIN_TEXT};
+
+
+ /**@see org.apache.fop.render.AbstractRendererMaker */
+ public Renderer makeRenderer(FOUserAgent ua) {
+ return new TXTRenderer();
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#needsOutputStream() */
+ public boolean needsOutputStream() {
+ return true;
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#getSupportedMimeTypes() */
+ public String[] getSupportedMimeTypes() {
+ return MIMES;
+ }
+
+}
diff --git a/src/java/org/apache/fop/render/xml/XMLRenderer.java b/src/java/org/apache/fop/render/xml/XMLRenderer.java
index ad6c9331a..e02b07f2f 100644
--- a/src/java/org/apache/fop/render/xml/XMLRenderer.java
+++ b/src/java/org/apache/fop/render/xml/XMLRenderer.java
@@ -42,6 +42,7 @@ import org.apache.fop.render.RendererContext;
import org.apache.fop.render.XMLHandler;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.FOPException;
+import org.apache.fop.apps.MimeConstants;
import org.apache.fop.area.Area;
import org.apache.fop.area.BeforeFloat;
import org.apache.fop.area.Block;
@@ -79,7 +80,7 @@ import org.apache.fop.area.inline.WordArea;
public class XMLRenderer extends PrintRenderer {
/** XML MIME type */
- public static final String XML_MIME_TYPE = "application/x-fop-areatree";
+ public static final String XML_MIME_TYPE = MimeConstants.MIME_FOP_AREA_TREE;
/** Main namespace in use. */
public static final String NS = "";
diff --git a/src/java/org/apache/fop/render/xml/XMLRendererMaker.java b/src/java/org/apache/fop/render/xml/XMLRendererMaker.java
new file mode 100644
index 000000000..639a63993
--- /dev/null
+++ b/src/java/org/apache/fop/render/xml/XMLRendererMaker.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.xml;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.render.AbstractRendererMaker;
+import org.apache.fop.render.Renderer;
+
+/**
+ * RendererMaker for the Area Tree XML Renderer.
+ */
+public class XMLRendererMaker extends AbstractRendererMaker {
+
+ private static final String[] MIMES = new String[] {MimeConstants.MIME_FOP_AREA_TREE};
+
+
+ /**@see org.apache.fop.render.AbstractRendererMaker */
+ public Renderer makeRenderer(FOUserAgent ua) {
+ return new XMLRenderer();
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#needsOutputStream() */
+ public boolean needsOutputStream() {
+ return true;
+ }
+
+ /** @see org.apache.fop.render.AbstractRendererMaker#getSupportedMimeTypes() */
+ public String[] getSupportedMimeTypes() {
+ return MIMES;
+ }
+
+}